package com.company.ecis.controller;


import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import com.company.ecis.domain.Tradecodition;

import com.company.ecis.entity.BalanceInfo;
import com.company.ecis.entity.BankCard;
import com.company.ecis.entity.Trade;
import com.company.ecis.entity.Userinfo;
import com.company.ecis.service.BalanceInfoService;
import com.company.ecis.service.BankCardService;
import com.company.ecis.service.TradeService;
import com.company.ecis.service.UserinfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.math.BigDecimal;

import java.text.ParseException;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author testjava
 * @since 2022-08-04
 */
@RestController
@RequestMapping("/ecis/trade")
public class TradeController {

    @Autowired
    private TradeService tradeService;
    @Autowired
    private BalanceInfoService balanceInfoService;
    @Autowired
    private UserinfoService userinfoService;
    @Autowired
    private BankCardService bankCardService;


    @RequestMapping("/transfer")
    public String transfer(@RequestParam BigDecimal money, // 转账金额
                                        @RequestParam Integer password, // 支付密码
                                        @RequestParam Integer account,  // 收款人账号
                                        @RequestParam Boolean wey,      // 转账方式标识
                                        @RequestParam String name,      // 收款人姓名
                                        @RequestParam(required = false, defaultValue = "null") String payerCard, // 扣款卡号
                                        @RequestParam int userId, // 登录用户id
                                        HttpSession session) {
        Trade trade = new Trade();
        JSONObject jsonObject = new JSONObject();
        //获取到转账用户
        Userinfo user = (Userinfo) session.getAttribute(String.valueOf(userId));
        //向trade表要插入的数据
        trade.setPayerUsername(user.getUsername());
        trade.setPayeeUsername(name);
        trade.setGmtCreated(new Date());
        // 取转账金额的相反数
        // 转账对于用户来说是扣钱的流水
        trade.setPrice(money.negate());
        trade.setPayType("转款");
        trade.setCardId(user.getCardId());
        //判断密码是否正确
        if (!Objects.equals(user.getPassword(), SecureUtil.md5(String.valueOf(password)))) {
            jsonObject.set("code", 405).set("msg", "支付密码不一致");
            return JSONUtil.toJsonStr(jsonObject);
        }
        BalanceInfo info = balanceInfoService.getBalanceByUsername(user.getUsername());
        // 判断转账金额是否充足
        if (money.compareTo(info.getBalance()) > 0) {
            jsonObject.set("code", 406).set("msg", "账户余额不足");
            return JSONUtil.toJsonStr(jsonObject);
        }
        //被转账户的判断（判断是否存在）
        Userinfo payeeUser = userinfoService.selectOneByUserIdAndUsername(account, name);
        if (payeeUser == null) {
            jsonObject.set("code", 407).set("msg", "用户不存在");
            return JSONUtil.toJsonStr(jsonObject);
        }
        //转账方式的判断
        //如果为转入账户
        if (wey) {
            // 设置流水表收款账户id
            trade.setPayeeIdent(payeeUser.getId().toString());
            // 设置流水表转账账户id
            trade.setPayerIdent(user.getId().toString());
            // 插入流水表
            tradeService.insertTrade(trade);
            // 更新用户存款
            BalanceInfo payerBalance = new BalanceInfo();
            payerBalance.setBalance(money.negate());
            payerBalance.setUsername(user.getUsername());
            balanceInfoService.updateBalanceByUsername(payerBalance);
            // 更新收款人存款
            BalanceInfo payeeBalance = new BalanceInfo();
            payeeBalance.setBalance(money);
            payeeBalance.setUsername(name);
            balanceInfoService.updateBalanceByUsername(payeeBalance);
            // 发送转账消息
            jsonObject.set("code", 200).set("msg", "转账成功");
            return JSONUtil.toJsonStr(jsonObject);
        } else {
            // 使用银行卡付款
            // 模仿银行端 判断银行卡余额是否充足
            BankCard payerCardInfo = bankCardService.getBankCardBycardNumber(payerCard);
            // 判断银行卡内余额是否满足要求
            if (money.compareTo(payerCardInfo.getBalance()) > 0) {
                jsonObject.set("code", 406).set("msg", "账户余额不足");
                return JSONUtil.toJsonStr(jsonObject);
            }
            // 设置流水表收款账户id
            trade.setPayeeIdent(payeeUser.getId().toString());
            // 设置流水表转账账户银行卡号
            trade.setPayerIdent(payerCard);
            // 插入流水
            tradeService.insertTrade(trade);
            // 银行卡内扣款
            payerCardInfo.setBalance(payerCardInfo.getBalance().subtract(money));
            bankCardService.updateBankCard(payerCardInfo);
            // 收款人账户余额增加
            BalanceInfo payeeBalance = new BalanceInfo();
            payeeBalance.setBalance(money);
            payeeBalance.setUsername(name);
            balanceInfoService.updateBalanceByUsername(payeeBalance);
            // 返回转账成功信息
            jsonObject.set("code", 200).set("msg", "转账成功");
            return JSONUtil.toJsonStr(jsonObject);
        }
    }




    @RequestMapping("/tradetable")
    public String showTradeTable(HttpSession session){
        //在进入转款页面之前判断登录状态---如果Session没有电子账户的话直接返回登录界面
//        //判断用户是否是登录状态
//        String card_id = (String) session.getAttribute("card_id");
//        System.out.println(card_id);
//        //无法获取card_id直接返回登录界面
//        if(card_id==null){
//            System.out.println("我进来了");
//            return "redirect:/hello.html";
//        }
        return "Tradetable";
    }
    @ResponseBody
    @RequestMapping("/findByCondition")
    public Object findByCondition(@RequestParam("page") Integer page,
                                  @RequestParam("limit") Integer limit,
                                  Tradecodition tradecodition, HttpSession session) throws ParseException {
        //如果不是登录状态,返回直接跳转到首页面
        //如果没有绑定的银行卡直接跳转到
//         如果用户已经登录,则查询流水时的付款者标识为当前用户银行卡号cardId(从Session中获取)
//        if(tradecodition.getStartTime()==null){
//            return tradeService.findByCondition(page, limit);
//        }

        return tradeService.findByCondition(page, limit,tradecodition,session);

    }

}

